#include "svc.h"
#include <commlib.h>
#include <taskMgr.h>
#include <Console.h>

#define EXPEND_IT(x) #x

#define DO_SWI(swi_no) \
void call_swi_##swi_no() { \
    __asm__ ( \
        "swi " EXPEND_IT(swi_no) "\n" \
    ); \
} \
void do_swi_##swi_no()

#define ADD_SWI_MAP(swi_no) {swi_no, do_swi_##swi_no}

DO_SWI(SWI_JUST_FOR_TEST) {
    printfk("test ok. now am in swi.\r\n");
}

DO_SWI(SWI_LIST_ALL_TASK_INFO) {
    tm_dump_all_tsk_info();
}

DO_SWI(SWI_LIST_1_TASK_INFO) {
    printfk("do SWI_LIST_1_TASK_INFO\r\n");
}

DO_SWI(SWI_RESCHEDULE_TASK) {
    printfk("never shuld be did. SWI_RESCHEDULE_TASK\r\n");
}

DO_SWI(SWI_TASK_INFO_BRIEF) {
    tm_tsk_info_brief();
}


static struct {
    int swi_no;
    void (*on_swi_fn)();
} swi_no_map[] = {
    ADD_SWI_MAP(SWI_JUST_FOR_TEST),
    ADD_SWI_MAP(SWI_LIST_ALL_TASK_INFO),
    ADD_SWI_MAP(SWI_LIST_1_TASK_INFO),
    ADD_SWI_MAP(SWI_RESCHEDULE_TASK),
    ADD_SWI_MAP(SWI_TASK_INFO_BRIEF),
};
void on_swi_entry(int swi_no) {
    int i = 0;
    for(; i < sizeof(swi_no_map) / sizeof(swi_no_map[0]); ++i) {
        if(swi_no == swi_no_map[i].swi_no) {
            swi_no_map[i].on_swi_fn();
            return;
        }
    }
    printfk("invalid swi_no:0x%x\r\n", swi_no);
}
